/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.service.impl;

import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tesis.common.utils.CollectionsUtil;
import tesis.domain.Cargo;
import tesis.domain.Nombrecargo;
import tesis.dto.in.CargoDTO;

import tesis.service.CargoService;
import tesis.service.CrudService;
import tesis.utils.Constantes;
import tesis.utils.TesisStringUtils;

/**
 *
 * @author hectdx
 */
@Transactional
@Service("cargoService")
public class CargoServiceImpl implements CargoService{
    private final static Logger LOG=LoggerFactory.getLogger(CargoServiceImpl.class);
    @Inject
    private CrudService crud;
    
    
    @Override
    public List<CargoDTO> findAll() {
        List<CargoDTO> lstCargos=new ArrayList<CargoDTO>();
        List<Nombrecargo>results=null;
        CargoDTO cargoDTO=null;
        try{
            results=crud.findByNamedQuery(Nombrecargo.FIND_ALL);
            if (!CollectionsUtil.isEmpty(results)){
                for (Nombrecargo nc: results){
                    if (nc.getIdcargo().getIdcargo().compareTo(Constantes.SIN_CARGO)!=0){
                        cargoDTO=new CargoDTO();
                        cargoDTO.setIdCargo(nc.getIdcargo().getIdcargo());
                        cargoDTO.setNombre(nc.getNombre());
                        lstCargos.add(cargoDTO);
                    }
                }
            }
            LOG.info("lista obtenida con éxito, tam: "+lstCargos.size());
        }catch(RuntimeException ex){
            LOG.error("Error al obtener cargos",ex);
            throw ex;
        }
        return lstCargos;
    }
    
    @Override
    public Integer cantidadCargos(CargoDTO filtro) {
        try{
            LOG.info("contando cargos");
           return ((Long)construirFindQuery(filtro,true).getSingleResult()).intValue();
            
        }catch(RuntimeException ex){
            LOG.error("Error contar cargos",ex);
            throw ex;
        }
        
    }
    
    private Query construirFindQuery(CargoDTO filtro, boolean contar){
        Query query=null;
        try{
        StringBuilder sb=new StringBuilder();
        if (!contar){
            sb.append("SELECT c ");
        }else{
            sb.append("SELECT count(c) ");
        }
          sb.append(" FROM Cargo c where c.esActivo!='E' and c.idcargo != 1 ");
        if (TesisStringUtils.conValor(filtro.getNombre())){
             sb.append(" AND UPPER(c.nombre) like :nombre ");
        }
        if (!contar){
            sb.append(" ORDER BY c.nombre asc ");
        }
       
        query=crud.getEm().createQuery(sb.toString());
        if (TesisStringUtils.conValor(filtro.getNombre())){
            query.setParameter("nombre", "%"+filtro.getNombre().trim().toUpperCase()+"%");
        }
        if (!contar && filtro.getStartIndex()!=null){
            query.setFirstResult(filtro.getStartIndex());
            query.setMaxResults(filtro.getResults());
        }
        }catch(RuntimeException ex){
            LOG.error("Error contar cargos",ex);
            throw ex;
        }
        return query;
    }

    @Override
    public CargoDTO findById(Integer idCargo) {
        CargoDTO cargoDTO=new CargoDTO();
        Cargo cargo=null;
        try{
            cargo=crud.find(idCargo, Cargo.class);
            if (cargo!=null){
                //cargoDTO=ConvertBeanUtil.toCargoDTO(cargo);
            }
            LOG.info("Cargo encontrado con éxito");
        }catch(RuntimeException ex){
            LOG.error("Error al buscar cargo: "+ex);
            throw ex;
        }
        return cargoDTO;
    }

   
    
    
    
}
